package cn.highedu.coolshark_product.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * Web资源授权
 */
@Configuration
@Slf4j
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 声明AuthenticationManager 提供密码认证服务
     * @return
     * @throws Exception
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    /**
     * 配置HTTP请求URL的认证规则
     * 类似于过滤器拦截的路径
     * @param http HTTP请求的认证规则
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        log.debug("配置HttpSecurity对象 {}", http.getClass().getName());
        // 不需要认证的路径, 统一处理
        String[] urls = {
                "/doc.html",
                "/favicon.ico",
                "/**/*.css",
                "/**/*.js",
                "/admin/login",
                "/swagger-resources",
                "/v2/api-docs"
        };
        // 配置拦截的路径 表明访问相应资源的角色认证信息
        http.authorizeRequests()
                /*// /static/**, /css/**, /js/**, /images/** 等静态资源 不需要认证
                .mvcMatchers("/static/**", "/css/**", "/js/**", "/images/**", "/admins/**").permitAll()
                //.mvcMatchers(urls).permitAll()
                .mvcMatchers("/admin/index.html").hasRole("ADMIN")
                .mvcMatchers("/manager/index.html").hasRole("MANAGER")
                // /user开头的请求 具有USER角色才能访问
                .mvcMatchers("/user/**").hasRole("USER")
                // /api开头的请求 具有ADMIN、MANAGER、USER任意一个角色都可以访问
                .mvcMatchers("/api/**").hasAnyRole("ADMIN", "MANAGER", "USER")
                // 其他路径需要登录才能访问
                .anyRequest().authenticated();
                //.and()
                // /login路径不要验证
                //.formLogin().permitAll();*/
                // 自定义的放行路径
                .mvcMatchers(urls).permitAll()
                // 其他路径都需要拦截
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll();
        // 暂时关闭前后端分离模式下的跨域访问攻击保护
        http.csrf().disable();

        // 配置跨域资源共享
        http.cors();
    }
}
